package br.com.programacao.concorrente.entidades;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;

/**
 * A classe Log é responsável por gerenciar os arquivos de log.
 */
public class Log {

    //private final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");    
    private static final File fileThread = new File("logThread.csv");
    private static final File fileExecution = new File("logExecution.csv");

    /**
     * Retorna o Logger utilizado pelo sistema. Recebe como parametro a classe
     * que está sendo utilizado.
     *
     * @param <T>
     * @param clazz
     * @return Logger
     */
    public synchronized static <T> Logger getLogger(Class<T> clazz) {
        return (Logger) LogManager.getLogger(clazz);
    }

    /**
     * Inclui no arquivo de log estruturado a execução de cada pedido feito por
     * cada thread.
     *
     * @param numExecution
     * @param threadID
     * @param numPedido
     * @param time
     */
    public synchronized static void includeLogFileThread(int numExecution, String threadID, String numPedido, long time) {
        FileWriter writer = null;
        PrintWriter saida = null;
        try {
            writer = new FileWriter(fileThread, true);
            saida = new PrintWriter(writer, true);

            saida.print(numExecution);
            saida.print(",");

            saida.print(Constantes.INTERVAL_THREAD);
            saida.print(",");

            saida.print(Constantes.QTD_FILES);
            saida.print(",");

            saida.print(Constantes.QTD_THREADS);
            saida.print(",");

            saida.print(threadID);
            saida.print(",");

            saida.print(numPedido);
            saida.print(",");

            //saida.println(dateFormat.format(horario.getTime()));
            saida.println(time);
        } catch (IOException e) {
            Log.getLogger(Log.class).error(e.getMessage());
        } finally {
            try {
                if (saida != null && writer != null) {
                    saida.close();
                    writer.close();
                }
            } catch (IOException e) {
                Log.getLogger(Log.class).error(e.getMessage());
            }
        }
    }

    /**
     *Inclui no arquivo de log estruturado a execução total da thread
     * @param numExecution
     * @param time
     * @param qtdThreadsProcess  - quantidade de vezes que a Thread processou 
     */
    public synchronized static void includeLogFileExecution(int numExecution, long time, int qtdThreadsProcess) {
        FileWriter writer = null;
        PrintWriter saida = null;
        try {
            writer = new FileWriter(fileExecution, true);
            saida = new PrintWriter(writer, true);

            saida.print(numExecution);
            saida.print(",");

            saida.print(Constantes.INTERVAL_THREAD);
            saida.print(",");

            saida.print(Constantes.QTD_FILES);
            saida.print(",");

            saida.print(Constantes.QTD_THREADS);
            saida.print(",");

            saida.print(qtdThreadsProcess);
            saida.print(",");

            //saida.println(dateFormat.format(horario.getTime()));
            saida.println(time);
        } catch (IOException e) {
            Log.getLogger(Log.class).error(e.getMessage());
        } finally {
            try {
                if (saida != null && writer != null) {
                    saida.close();
                    writer.close();
                }
            } catch (IOException e) {
                Log.getLogger(Log.class).error(e.getMessage());
            }
        }
    }
}
